/**
 * 洁净的继承者 —— 原型式继承 => 《JS中原型式继承》道格拉斯
 */

/**
 * 根据道格拉斯的观点实现的原型式继承代码：对类式继承的封装
 * 类式继承中的问题
 *      1、在子类中更改父类引用类型属性时，其他实例也会发生改变
 *      2、实例化父类时无法对父类属性进行初始化
 * 
 * 此代码依然会有上述问题，但是F过渡类的构造函数中无内容，所以开销比较小，使用起来也比较方便。
 * 如有必要可以将F过渡类缓存起来，不必每次创建一个新过渡类F
 * 
 * 原型式继承 和 类式继承
 * 相同点
 *      1、产生的问题一样
 *      2、父类对象中值类型的属性被复制，引用类型的属性被共用
 * @param {any} o 
 * @returns 
 */
function inheritObject(o) {
    // 声明一个过渡函数代码
    function F() {}
    // 过渡对象的原型继承父对象
    F.prototype = o;
    // 返回过渡对象的一个实例，该实例的原型继承了父对象
    return new F();
}

// 测试代码
var book = {
    name: 'js book',
    alikeBook: ['css book', 'html book']
};

var newBook = inheritObject(book);
newBook.name = 'ajax book';
newBook.alikeBook.push('xml book');

var otherBook = inheritObject(book);
otherBook.name = 'flash book';
otherBook.alikeBook.push('as book');

console.log(newBook.name);//ajax book
console.log(newBook.alikeBook);//['css book', 'html book', 'xml book', 'as book']

console.log(otherBook.name);//flash book
console.log(otherBook.alikeBook);//['css book', 'html book', 'xml book', 'as book']

console.log(book.name);//js book
console.log(book.alikeBook);//['css book', 'html book', 'xml book', 'as book']
